package com.dfs.online.matrix;

import java.util.Random;

import com.dfs.online.agent.MovimentacaoAgente;
import com.dfs.online.agent.OrigemDestinoAgente;


public class BarreiraMatrix {

	private MovimentacaoAgente ma;
	
	private Random r;
	
	
	//poss�veis lados para a barreira
	private boolean ladoCima = false;
	private boolean ladoBaixo = false;
	private boolean ladoEsquerda = false;
	private boolean ladoDireira = false;
	
	//valor aleatorio linha que pode variar de -1 at� 4 (incluso)
	private int x;
	//valor aleatorio coluna que pode variar de -1 at� 3 (incluso)
	private int y;

	//construtora
	public BarreiraMatrix(MovimentacaoAgente ma) {
		this.r = new Random();
		this.ma = ma;
		
		//valores aleat�rios para o posicionamento da barreira.
		this.x = r.nextInt(6) - 1;
		this.y = r.nextInt(5) - 1;
		
		//chama o m�todo para definir os lados da barreira.
		defineLadosBarreira();
	}
	
	//com base no valor de x e y ir� definir o posicionamento da barreira na matriz.
	//altas compara��es, s� que s�o f�ceis de entender...depois explico...
	//n�o consigo pensar em outra forma...MAS est� funcionando =);
	public void defineLadosBarreira(){
		
		if(x <= 2 && y == -1){
			this.ladoDireira = true;
			this.ladoBaixo = true; 
		}else if (x >=3 && y == -1) {
			this.ladoDireira = true;
			this.ladoCima = true; 
		}else if (x <= 2 && y == 3) {
			this.ladoEsquerda = true;
			this.ladoBaixo = true; 
		}else if (x >=3 && y == 3){
			this.ladoEsquerda = true;
			this.ladoCima = true; 
		}else if (y <= 1 && x ==-1 ){
			this.ladoDireira = true;
			this.ladoBaixo = true; 
		}else if (y >= 2 && x==-1){
			this.ladoEsquerda = true;
			this.ladoBaixo = true;
		}else if (y <=1 && x==4){
			this.ladoDireira = true;
			this.ladoCima = true;
		}else if (y >=2 && x==4){
			this.ladoEsquerda = true;
			this.ladoCima = true; 
		}else if (x == 0 && y == 0){
			this.ladoDireira = true;
			this.ladoBaixo = true;
		}else if (x == 0 && y == 2){
			this.ladoEsquerda = true;
			this.ladoBaixo = true;
		}else if (x == 3 && y == 0){
			this.ladoDireira = true;
			this.ladoCima = true;
		}else if (x ==3 && y == 2){
			this.ladoEsquerda = true;
			this.ladoCima = true;
		}else if (x ==0 && y == 1){
			if(r.nextInt(2) == 0){
				this.ladoEsquerda = true;
			}else{
				this.ladoDireira = true;
			}
			this.ladoBaixo = true;
		}else if (x ==3 && y == 1){
			if(r.nextInt(2) == 0){
				this.ladoEsquerda = true;
			}else{
				this.ladoDireira = true;
			}
			this.ladoCima = true;
		}else if ((x ==1|| x==2) && y == 0){
			this.ladoDireira = true;
			if(r.nextInt(2) == 0){
				this.ladoCima = true;
			}else{
				this.ladoBaixo = true;
			}
		}else if ((x ==1|| x==2) && y == 2){
			this.ladoEsquerda = true;
			if(r.nextInt(2) == 0){
				this.ladoCima = true;
			}else{
				this.ladoBaixo = true;
			}
		}else if ((x ==1|| x==2) && y == 1){
			if(r.nextInt(2) == 0){
				this.ladoEsquerda = true;
			}else{
				this.ladoDireira = true;
			}
			if(r.nextInt(2) == 0){
				this.ladoCima = true;
			}else{
				this.ladoBaixo = true;
			}
		}
		
		//atualizando a movimenta��o do agenteee!
		atualizaMovimentacaoAgente();
		
	}

	//com os valores para "cima" ou "baixo" - "direita" ou "esquerda" e o x e y ser� utilizado para atualizar a lista 
	public void atualizaMovimentacaoAgente(){

		//cima
		if (ladoCima) {
			
				
				for (OrigemDestinoAgente aod : ma.getAgenteOrigemDestino()) {
					
					if (aod.getOrigemX() == this.x &&  aod.getOrigemY() == this.y &&  aod.getDestinoX() == this.x && aod.getDestinoY() == this.y+1) {		
						ma.getMovimentacaoAgente().put(aod, false);
					}else if (aod.getOrigemX() == this.x-1 && aod.getOrigemY() ==  this.y && aod.getDestinoX() == this.x-1 && aod.getDestinoY() == this.y+1) {	
						ma.getMovimentacaoAgente().put(aod, false);
					}else if (aod.getOrigemX() == this.x && aod.getOrigemY() ==  this.y+1 && aod.getDestinoX() == this.x && aod.getDestinoY() == this.y) {
						ma.getMovimentacaoAgente().put(aod, false);
					}else if (aod.getOrigemX() == this.x-1 && aod.getOrigemY() ==  this.y+1 && aod.getDestinoX() == this.x-1 && aod.getDestinoY() == this.y) {
						ma.getMovimentacaoAgente().put(aod, false);
					}
					
				}
		}
		
		//baixo
		if (ladoBaixo) {
			
			for (OrigemDestinoAgente aod : ma.getAgenteOrigemDestino()) {
				
				if (aod.getOrigemX() == this.x+1 &&  aod.getOrigemY() == this.y &&  aod.getDestinoX() == this.x+1 && aod.getDestinoY() == this.y+1) {		
					ma.getMovimentacaoAgente().put(aod, false);
				}else if (aod.getOrigemX() == this.x+2 && aod.getOrigemY() ==  this.y && aod.getDestinoX() == this.x+2 && aod.getDestinoY() == this.y+1) {	
					ma.getMovimentacaoAgente().put(aod, false);
				}else if (aod.getOrigemX() == this.x+1 && aod.getOrigemY() ==  this.y+1 && aod.getDestinoX() == this.x+1 && aod.getDestinoY() == this.y) {
					ma.getMovimentacaoAgente().put(aod, false);
				}else if (aod.getOrigemX() == this.x+2 && aod.getOrigemY() ==  this.y+1 && aod.getDestinoX() == this.x+2 && aod.getDestinoY() == this.y) {
					ma.getMovimentacaoAgente().put(aod, false);
				}
				
			}
		}
		
		//esquerda
		if (ladoEsquerda) {
			
			for (OrigemDestinoAgente aod : ma.getAgenteOrigemDestino()) {
				
				if (aod.getOrigemX() == this.x &&  aod.getOrigemY() == this.y &&  aod.getDestinoX() == this.x+1 && aod.getDestinoY() == this.y) {		
					ma.getMovimentacaoAgente().put(aod, false);
				}else if (aod.getOrigemX() == this.x && aod.getOrigemY() ==  this.y-1 && aod.getDestinoX() == this.x+1 && aod.getDestinoY() == this.y-1) {	
					ma.getMovimentacaoAgente().put(aod, false);
				}else if (aod.getOrigemX() == this.x+1 && aod.getOrigemY() ==  this.y && aod.getDestinoX() == this.x && aod.getDestinoY() == this.y) {
					ma.getMovimentacaoAgente().put(aod, false);
				}else if (aod.getOrigemX() == this.x+1 && aod.getOrigemY() ==  this.y-1 && aod.getDestinoX() == this.x && aod.getDestinoY() == this.y-1) {
					ma.getMovimentacaoAgente().put(aod, false);
				}
				
			}
		}
		
		//direita
		if (ladoDireira) {
			
			for (OrigemDestinoAgente aod : ma.getAgenteOrigemDestino()) {
				
				if (aod.getOrigemX() == this.x &&  aod.getOrigemY() == this.y+1 &&  aod.getDestinoX() == this.x+1 && aod.getDestinoY() == this.y+1) {		
					ma.getMovimentacaoAgente().put(aod, false);
				}else if (aod.getOrigemX() == this.x && aod.getOrigemY() ==  this.y+2 && aod.getDestinoX() == this.x+1 && aod.getDestinoY() == this.y+2) {	
					ma.getMovimentacaoAgente().put(aod, false);
				}else if (aod.getOrigemX() == this.x+1 && aod.getOrigemY() ==  this.y+1 && aod.getDestinoX() == this.x && aod.getDestinoY() == this.y+1) {
					ma.getMovimentacaoAgente().put(aod, false);
				}else if (aod.getOrigemX() == this.x+1 && aod.getOrigemY() ==  this.y+2 && aod.getDestinoX() == this.x && aod.getDestinoY() == this.y+2) {
					ma.getMovimentacaoAgente().put(aod, false);
				}
				
			}
			
		}
		
		//printa a posi��o da barreira e a sua orienta��o.
		printBarreitaMatrix();
		
	}
	
	//print mensagem
	public void printBarreitaMatrix(){
		
		System.out.println("Considerando o ponto a interseção linha x (-1 até 4) e y (-1 até 3)");
		System.out.println("Valor x: "+this.x );
		System.out.println("Valor y: "+this.y );
		if (ladoCima) {
			System.out.println("Barreira para cima!");
		}
		if (ladoBaixo) {
			System.out.println("Barreira para baixo!");
		}
		if (ladoDireira) {
			System.out.println("Barreira para a direita!");
		}
		if (ladoEsquerda) {
			System.out.println("Barreira para a esquerda!");
		}
		
	}
	
	//getters e setters
	public MovimentacaoAgente getMa() {
		return ma;
	}

	public void setMa(MovimentacaoAgente ma) {
		this.ma = ma;
	}

	public boolean isLadoCima() {
		return ladoCima;
	}

	public void setLadoCima(boolean ladoCima) {
		this.ladoCima = ladoCima;
	}

	public boolean isLadoBaixo() {
		return ladoBaixo;
	}

	public void setLadoBaixo(boolean ladoBaixo) {
		this.ladoBaixo = ladoBaixo;
	}

	public boolean isLadoEsquerda() {
		return ladoEsquerda;
	}

	public void setLadoEsquerda(boolean ladoEsquerda) {
		this.ladoEsquerda = ladoEsquerda;
	}

	public boolean isLadoDireira() {
		return ladoDireira;
	}

	public void setLadoDireira(boolean ladoDireira) {
		this.ladoDireira = ladoDireira;
	}

	public int getX() {
		return x;
	}

	public void setX(int x) {
		this.x = x;
	}

	public int getY() {
		return y;
	}

	public void setY(int y) {
		this.y = y;
	}
	
}
